spring MVC知识点总结(1) - DispatcherServlet

DispatcherServlet作用

文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);

通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);

通过ViewResolver解析逻辑视图名到具体视图实现;

本地化解析;

渲染具体的视图等;

如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

DispatcherServlet中使用的Bean
DispatcherServlet默认使用WebApplicationContext作为上下文,因此我们来看一下该上下文中有哪些特殊的Bean:

Controller:处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理;

HandlerMapping:请求到处理器的映射,如果映射成功返回一个HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象;如BeanNameUrlHandlerMapping将URL与Bean名字映射,映射成功的Bean就是此处的处理器;

HandlerAdapter:HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,并且掉处理器的handleRequest方法进行功能处理;

ViewResolver:ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;如InternalResourceViewResolver将逻辑视图名映射为jsp视图;

LocalResover:本地化解析,因为Spring支持国际化,因此LocalResover解析客户端的Locale信息从而方便进行国际化;

ThemeResovler:主题解析,通过它来实现一个页面多套风格,即常见的类似于软件皮肤效果;

MultipartResolver:文件上传解析,用于支持文件上传;

HandlerExceptionResolver:处理器异常解析,可以将异常映射到相应的统一错误界面,从而显示用户友好的界面(而不是给用户看到具体的错误信息);

RequestToViewNameTranslator:当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名;

FlashMapManager:用于管理FlashMap的策略接口,FlashMap用于存储一个请求的输出,当进入另一个请求时作为该请求的输入,通常用于重定向场景,后边会细述。

客户端缓存控制

Http协议缓存控制

HTTP1.0缓存控制响应头
Pragma:no-cache:表示防止客户端缓存,需要强制从服务器获取最新的数据;
Expires:HTTP1.0响应头,本地副本缓存过期时间,如果客户端发现缓存文件没有过期则不发送请求,HTTP的日期时间必须是格林威治时间(GMT), 如”Expires:Wed, 14 Mar 2012 09:38:32 GMT”;

HTTP1.1缓存控制响应头
Cache-Control :no-cache 强制客户端每次请求获取服务器的最新版本,不经过本地缓存的副本验证;
Cache-Control :no-store 强制客户端不保存请求的副本,该设置是防止Firefox缓存
Cache-Control:max-age=[秒] 客户端副本缓存的最长时间,类似于HTTP1.0的Expires,只是此处是基于请求的相对时间间隔来计算,而非绝对时间。

Spring缓存控制

cacheSeconds

cacheSeconds=5, 缓存5秒

cacheSeconds=0,不缓存

acheSeconds<0,将不添加任何数据,响应头什么缓存控制信息也不加。

http请求头与springcacheSeconds配置关系

cacheSeconds = 0 时,则将设置如下响应头数据:
//HTTP 1.0的不缓存响应头
Pragma:no-cache
// useExpiresHeader=true时,HTTP 1.0
Expires:1L
//useCacheControlHeader=true时,HTTP 1.1
Cache-Control :no-cache
// useCacheControlNoStore=true时,该设置是防止Firefox缓存
Cache-Control :no-store

cacheSeconds > 0 时,则将设置如下响应头数据:
// useCacheControlHeader=true时,HTTP 1.1
Expires:System.currentTimeMillis() + cacheSeconds * 1000L
// useExpiresHeader=true时,HTTP 1.0
Cache-Control :max-age=cacheSeconds

cacheSeconds < 0 时,则什么都不设置,即保留上次的缓存设置。

Last-Modified

在客户端第一次输入url时,服务器端会返回内容和状态码200表示请求成功并返回了内容;同时会添加一个”Last-Modified”的响应头表示此文件在服务器上的最后更新时间:如”Last-Modified:Wed, 14 Mar 2012 10:22:42 GMT”表示最后更新时间为(2012-03-14 10:22);

客户端第二次请求此URL时,客户端会向服务器发送请求头 “If-Modified-Since”,询问服务器该时间之后当前请求内容是否有被修改过,如”If-Modified-Since: Wed, 14 Mar 2012 10:22:42 GMT”,如果服务器端的内容没有变化,则自动返回 HTTP 304状态码(只要响应头,内容为空,这样就节省了网络带宽)。

ETag(实体标记)

浏览器第一次请求,服务器在响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,类似服务器端返回的格式:”ETag:”0f8b0c86fe2c0c7a67791e53d660208e3””

浏览器第二次请求,客户端的查询更新格式是这样的:”If-None-Match:”0f8b0c86fe2c0c7a67791e53d660208e3””,如果ETag没改变,表示内容没有发生改变,则返回状态304。

客户端强制缓存过期

可以按ctrl+F5强制刷新(会添加请求头 HTTP1.0 Pragma:no-cache和 HTTP1.1 Cache-Control:no-cache、If-Modified-Since请求头被删除)表示强制获取服务器内容,不缓存。

在请求的url后边加上时间戳来重新获取内容,加上时间戳后浏览器就认为不是同一份内容:ttp://sishuok.com/?2343243243 和 http://sishuok.com/?34334344 是两次不同的请

缓存控制特殊情况

对于一般的页面跳转(如超链接点击跳转、通过js调用window.open打开新页面都是会使用浏览器缓存的,在未过期情况下会直接使用浏览器缓存的副本,在未过期情况下一次请求也不发送);

对于刷新页面(如按F5键刷新),会再次发送一次请求到服务器的;

-------------本文到此结束,感谢您的阅读-------------